// 使用 async 控制并发
// 学习 async(https://github.com/caolan/async ) 的使用。这里有个详细的 async demo 演示：https://github.com/alsotang/async_demo
// 学习使用 async 来控制并发连接数。
// 当你需要去多个源(一般是小于 10 个)汇总数据的时候，用 eventproxy 方便；
// 当你需要用到队列，需要控制并发数，或者你喜欢函数式编程思维时，使用 async。
// 大部分场景是前者，所以我个人大部分时间是用 eventproxy 的。

var async = require('async');

// 并发连接数的计数器
var concurrencyCount = 0;
// 调用fetchUrl时，它会返回 url 的页面内容回来。
var fetchUrl = function (url, callback) {
    // delay 的值在 2000 以内，是个随机的整数
    var delay = parseInt((Math.random() * 10000000) % 2000, 10);
    concurrencyCount++;
    console.log('现在的并发数是', concurrencyCount, '，正在抓取的是', url, '，耗时' + delay + '毫秒');

    setTimeout(() => {
        concurrencyCount--;
        callback(null, url + " html content ");
    }, delay);
}

// 伪造一组链接
var urls = [];
for (var i = 0; i < 30; i++) {
    urls.push('http://datasource_' + i);
}

// async.mapLimit 来并发抓取
// 并发连接数需要控制在 5 个
async.mapLimit(urls, 5, (url, callback) => {
    fetchUrl(url, callback);
}, (err, result) => {
    console.log("final");
    console.log(result);
});
